package com.ktjiaoyu.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @return 13141
 * 2025/7/1
 * 19:23
 */
public class BaseController {
    private static final Logger LOGGER = LoggerFactory.getLogger(BaseController.class);
    // 使用 @InitBinder 解决 SpringMVC 日期类型无法绑定的问题
    @InitBinder
    public void initBinder(WebDataBinder dataBinder) {
        LOGGER.info("进入 BaseController 的 initBinder 方法");
        dataBinder.registerCustomEditor(Date.class,
            new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }
    //    负责转发到任意路径
    public String forward(String url) {
        return UrlBasedViewResolver.FORWARD_URL_PREFIX + url;
    }
    //    负责重定向到任意路径
    public String redirect(String url) {
        return UrlBasedViewResolver.REDIRECT_URL_PREFIX + url;
    }
    // 通过@Autowired直接注入 request 属性
//    @Autowired
//    private HttpServletRequest request;
    //    获取 request 对象
    public HttpServletRequest request() {
        return ((ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes()).getRequest();
//        return request;
    }
//    设置数据到 request 作用域中
    public void request(String name, Object obj) {
        request().setAttribute(name, obj);
    }
//    从 request 作用域中获取数据
    public <T> T request(String name) {
        return (T) request().getAttribute(name);
    }
//    获取 session 对象
    public HttpSession session() {
        return request().getSession();
    }
//    设置数据到 session 作用域中
    public void session(String name, Object obj) {
        session().setAttribute(name, obj);
    }
//    从 session 作用域中获取数据
    public <T> T session(String name) {
        return (T) session().getAttribute(name);
    }
}
